![Web ACL で Count となったリクエストは WAF ログにどのように記録されますか](https://devio2023-media.developers.io/wp-content/uploads/2023/08/aws-waf.png)
Web ACL で Count となったリクエストは WAF ログにどのように記録されますか
困っていた内容
WAF Web ACL で特定のルールのアクションを Count に設定し、対象のリクエストの数を調査しています。
Count となったリクエストがあるはずですが、Athena を使用し WAF ログ直下の action フィールドが "count" となっているレコードをクエリで抽出しようとしましたが、結果は 0 件でした。
Count リクエストは WAF ログにどのように記録されているのでしょうか。
どう対応すればいいの?
WAF ログ直下の action フィールドに表示されるのは、allow, block, CAPTCHA, および challenge のみで、Count は記録されません。1
結論を先に申し上げると、Count の記録フィールドとログ出力は以下 3 つのケースのいずれかになります。
- WAF ログ直下の "nonTerminatingMatchingRules" フィールドに
"action": "COUNT"
として記録 -
"ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに
"action": "COUNT"
として記録 -
"ruleGroupList" フィールド内の "excludedRules" フィールドに
"exclusionType": "EXCLUDED_AS_COUNT"
として記録
記録されるフィールドは、Count として設定した対象や、項目によって決定されます。
以下では、各フィールドに記録されるケースについて詳しく説明します。
1. WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT"
として記録
このフィールドに記録されるのは、以下の 2 パターンです。
- 1-1. カスタムルールのアクションを Count に設定した場合
- 1-2. ルールグループのアクションを Count にオーバーライドした場合
1-1. カスタムルールのアクションを Count に設定した場合
Web ACL のルール追加画面で [Rule builder] を選択し、カスタムルールを作成・追加することができますが、このカスタムルールのアクションを Count としたケースです。
1-2.ルールグループのアクションを Count にオーバーライドした場合
Web ACL へのルールグループ追加・編集時に、画面最下部にある項目 [Override rule group action to count] のチェックボックスをチェックを入れることで、ルールグループのルールアクションを Count にオーバーライドしているケースです。
WAF ログ出力例
WAF ログの例は以下の通りです。(トグルを開いて表示)
{ "timestamp": 1697783245792, "formatVersion": 1, "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "terminatingRuleId": "Default_Action", "terminatingRuleType": "REGULAR", "action": "ALLOW", "terminatingRuleMatchDetails": [], "httpSourceName": "CF", "httpSourceId": "XXXXXXXXXX", "ruleGroupList": [ { "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet", "terminatingRule": { "ruleId": "NoUserAgent_HEADER", "action": "BLOCK", "ruleMatchDetails": null }, "nonTerminatingMatchingRules": [], "excludedRules": null, "customerConfig": null } ], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [ { "ruleId": "AWS-AWSManagedRulesCommonRuleSet", "action": "COUNT", "ruleMatchDetails": [] } ], "requestHeadersInserted": null, "responseCodeSent": null, "httpRequest": { "clientIp": "1.1.1.1", "country": "XX", "headers": [ { "name": "host", "value": "waflog-example.com" }, { "name": "accept", "value": "*/*" } ], "uri": "/", "args": "", "httpVersion": "HTTP/2.0", "httpMethod": "GET", "requestId": "XXXXXXXXXX" }, "labels": [ { "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header" } ], "ja3Fingerprint": "XXXXXXXXXX" }
2. "ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT"
として記録
このフィールドに記録されるのは、以下の 2 パターンです。
- 2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合
- 2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合
2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合
カスタムルールグループに登録したルールのデフォルトアクションを Count としたケースです。
・カスタムルールグループに Count アクションのルールを登録
2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合
Web ACL に追加したルールグループ内の各ルールは、それぞれの項目で [Override to count] を選択することで、対象ルールのみアクションを Count にオーバーライドすることができます。
WAF ログ出力例
WAF ログの例は以下の通りです。(トグルを開いて表示)
{ "timestamp": 1697782387503, "formatVersion": 1, "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "terminatingRuleId": "Default_Action", "terminatingRuleType": "REGULAR", "action": "ALLOW", "terminatingRuleMatchDetails": [], "httpSourceName": "CF", "httpSourceId": "XXXXXXXXXX", "ruleGroupList": [ { "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet", "terminatingRule": null, "nonTerminatingMatchingRules": [ { "ruleId": "NoUserAgent_HEADER", "action": "COUNT", "overriddenAction": "BLOCK", "ruleMatchDetails": [] } ], "excludedRules": null, "customerConfig": null } ], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "requestHeadersInserted": null, "responseCodeSent": null, "httpRequest": { "clientIp": "1.1.1.1", "country": "XX", "headers": [ { "name": "host", "value": "waflog-example.com" }, { "name": "accept", "value": "*/*" } ], "uri": "/", "args": "", "httpVersion": "HTTP/2.0", "httpMethod": "GET", "requestId": "XXXXXXXXXX" }, "labels": [ { "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header" } ], "ja3Fingerprint": "XXXXXXXXXX" }
3. "ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT"
として記録
このフィールドに記録されるのは、以下の 1 パターンのみです。
3-1. ルールグループ内、個別のルールのアクションを ExcludedRules を用いて、Count とした場合
ExcludedRules
は、2022 年 10 月 27 日にRuleActionOverrides
に置き換えられた機能です。2
(※ RuleActionOverrides
は、2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合 を JSON で記述したときに使用されます。)
そのため、現在、コンソールから ExcludedRules
を設定することはできませんが、以前からこの記述を使用している場合には引き続きこのログ形式となります。
また、AWS CLI や SDK、CloudFormation 等の IaC ツールを使用してWebACL を構成する場合にも、ExcludedRules
を使用することが可能です。
WAF ログ出力例
WAF ログの例は以下の通りです。(トグルを開いて表示)
{ "timestamp": 1698125333623, "formatVersion": 1, "webaclId": "arn:aws:wafv2:us-east-1:000000000000:global/webacl/waflog-test/XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX", "terminatingRuleId": "Default_Action", "terminatingRuleType": "REGULAR", "action": "ALLOW", "terminatingRuleMatchDetails": [], "httpSourceName": "CF", "httpSourceId": "XXXXXXXXXX", "ruleGroupList": [ { "ruleGroupId": "AWS#AWSManagedRulesCommonRuleSet", "terminatingRule": null, "nonTerminatingMatchingRules": [], "excludedRules": [ { "exclusionType": "EXCLUDED_AS_COUNT", "ruleId": "NoUserAgent_HEADER", "ruleMatchDetails": null } ], "customerConfig": null } ], "rateBasedRuleList": [], "nonTerminatingMatchingRules": [], "requestHeadersInserted": null, "responseCodeSent": null, "httpRequest": { "clientIp": "1.1.1.1", "country": "XX", "headers": [ { "name": "host", "value": "waflog-example.com" }, { "name": "accept", "value": "*/*" } ], "uri": "/", "args": "", "httpVersion": "HTTP/2.0", "httpMethod": "GET", "requestId": "XXXXXXXXXX" }, "labels": [ { "name": "awswaf:managed:aws:core-rule-set:NoUserAgent_Header" } ], "ja3Fingerprint": "XXXXXXXXXX" }
まとめ
Web ACL で特定のルールまたはルールグループのアクションを Count としたとき、WAF ログの出力パターンは以下の通りです。
1.WAF ログ直下の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
- 1-1. カスタムルールのアクションを Count に設定した場合
- 1-2. ルールグループのアクションを Count にオーバーライドした場合
2."ruleGroupList" フィールド内の "nonTerminatingMatchingRules" フィールドに "action": "COUNT" として記録
- 2-1. ルールグループ内、個別のルールのデフォルトアクションを Count に設定した場合
- 2-2. ルールグループ内、個別のルールのアクションを Count にオーバライドした場合
3."ruleGroupList" フィールド内の "excludedRules" フィールドに "exclusionType": "EXCLUDED_AS_COUNT" として記録
- 3-1. ルールグループ内、個別のルールのアクションを excludedRules を用いて、Count とした場合
参考資料
- Action overrides in rule groups - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
-
Log Fields - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
-
Action overrides in rule groups - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
注釈
-
Log fields - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
action
The terminating action that AWS WAF applied to the request. This indicates either allow, block, CAPTCHA, or challenge.
-
Action overrides in rule groups - AWS WAF, AWS Firewall Manager, and AWS Shield Advanced
JSON listing: RuleActionOverrides replaces ExcludedRules
If you set rule group rule actions to Count in your web ACL configuration before October 27, 2022, AWS WAF saved your overrides in the web ACL JSON as
ExcludedRules
. Now, the JSON setting for overriding a rule to Count is in theRuleActionOverrides
settings.When you use the AWS WAF console to edit the existing rule group settings, the console automatically converts any
ExcludedRules
settings in the JSON toRuleActionOverrides
settings, with the override action set to Count.